{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "7f7d69f9",
   "metadata": {},
   "source": [
    "Copyright © 2022 Gurobi Optimization, LLC\n",
    "\n",
    "# How Much Is Too Much? Avocado Pricing and Supply Using Mathematical Optimization\n",
    "\n",
    "A [Food Network article](https://www.foodnetwork.com/fn-dish/news/2018/3/avocado-unseats-banana-as-america-s-top-fruit-import-by-value) from March 2017 declared, \"Avocado unseats banana as America's top fruit import.\" This declaration is incomplete and debatable for reasons other than whether  avocado is a fruit. Avocados are expensive.\n",
    "\n",
    "As a supplier, setting an appropriate avocado price requires a delicate trade-off. \n",
    "Set it too high and you lose customers. Set it too low and you won't make a profit.\n",
    "Equipped with good data, the avocado pricing and supply problem is *ripe* with opportunities for demonstrating the power of optimization and data science.\n",
    "\n",
    "They say when life gives you avocados, make guacamole.\n",
    "Just like the perfect guacamole needs the right blend of onion, lemon and spices, finding an optimal avocado price needs the right blend of descriptive, predictive and prescriptive analytics.\n",
    "\n",
    "|<img src=\"avocado_image_grocery.jpeg\" width=\"500\" align=\"center\">| \n",
    "|:--:|\n",
    "| <b>Avocados: a quintessential corner of a grocery store. Image Credits: [New York Post](https://nypost.com/2022/02/15/us-will-halt-mexico-avocado-imports-as-long-as-necessary/) </b>| \n",
    "\n",
    "\n",
    "**Goal**: Develop a data science pipeline for pricing and distribution of avocados to maximize revenue.\n",
    "\n",
    "This notebook walks through a decision-making pipeline that culminates in a mathematical optimization model.\n",
    "There are three stages: \n",
    "- First, understand the dataset and infer the relationships between categories such as the sales, price, region, and seasonal trends.\n",
    "- Second, build a prediction model that predicts the demand for avocados as a function of price, region, year and the seasonality.\n",
    "- Third, design an optimization problem that sets the optimal price and supply quantity to maximize the net revenue while incorporating costs for wastage and transportation.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2e5dc427",
   "metadata": {},
   "source": [
    "## Load the Packages and the Datasets\n",
    "\n",
    "We use real sales data provided by the [Hass Avocado Board](https://hassavocadoboard.com/) (HAB), whose aim is to \"make avocados America’s most popular fruit\". This dataset contains consolidated information on several years' worth of market prices and sales of avocados. \n",
    "\n",
    "We will now load the following packages for analyzing and visualizing the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d0d518e0-8f9f-465e-a8da-3b66c1e3761e",
   "metadata": {},
   "outputs": [],
   "source": [
    "%pip install gurobipy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3024295a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import tree \n",
    "import seaborn as sns\n",
    "import sklearn \n",
    "import numpy as np  "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4537e1ae",
   "metadata": {},
   "source": [
    "The dataset from HAB contains sales data for the years 2019-2022. This data is augmented by a previous download from HAB available on [Kaggle](https://www.kaggle.com/datasets/timmate/avocado-prices-2020) with sales for the years 2015-2018.\n",
    "\n",
    "Each row in the dataset is the weekly number of avocados sold and the weekly average price of an avocado categorized by region and type of avocado. There are two types of avocados: conventional and organic. In this notebook, we will only consider the conventional avocados.\n",
    "There are eight large regions, namely the Great Lakes, Midsouth, North East, Northern New England, South Central, South East, West and Plains.\n",
    "\n",
    "Now, load the data and store into a Pandas dataframe."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d7ebd6bb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>region</th>\n",
       "      <th>date</th>\n",
       "      <th>type</th>\n",
       "      <th>price</th>\n",
       "      <th>units_sold</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Great_Lakes</td>\n",
       "      <td>1/7/19 0:00</td>\n",
       "      <td>Conventional</td>\n",
       "      <td>1.106743</td>\n",
       "      <td>3812441.96</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Great_Lakes</td>\n",
       "      <td>1/7/19 0:00</td>\n",
       "      <td>Organic</td>\n",
       "      <td>1.371280</td>\n",
       "      <td>275987.52</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Great_Lakes</td>\n",
       "      <td>1/13/19 0:00</td>\n",
       "      <td>Conventional</td>\n",
       "      <td>1.063457</td>\n",
       "      <td>3843318.68</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Great_Lakes</td>\n",
       "      <td>1/13/19 0:00</td>\n",
       "      <td>Organic</td>\n",
       "      <td>1.493384</td>\n",
       "      <td>244991.95</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Great_Lakes</td>\n",
       "      <td>1/20/19 0:00</td>\n",
       "      <td>Conventional</td>\n",
       "      <td>1.049931</td>\n",
       "      <td>4587957.69</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6799</th>\n",
       "      <td>West</td>\n",
       "      <td>11/18/18</td>\n",
       "      <td>Organic</td>\n",
       "      <td>1.610000</td>\n",
       "      <td>334096.14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6800</th>\n",
       "      <td>West</td>\n",
       "      <td>11/25/18</td>\n",
       "      <td>Conventional</td>\n",
       "      <td>1.240000</td>\n",
       "      <td>3260102.17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6801</th>\n",
       "      <td>West</td>\n",
       "      <td>11/25/18</td>\n",
       "      <td>Organic</td>\n",
       "      <td>1.730000</td>\n",
       "      <td>268362.34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6802</th>\n",
       "      <td>West</td>\n",
       "      <td>12/2/18</td>\n",
       "      <td>Conventional</td>\n",
       "      <td>1.200000</td>\n",
       "      <td>4594863.86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6803</th>\n",
       "      <td>West</td>\n",
       "      <td>12/2/18</td>\n",
       "      <td>Organic</td>\n",
       "      <td>1.620000</td>\n",
       "      <td>268969.03</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>6804 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           region          date          type     price  units_sold\n",
       "0     Great_Lakes   1/7/19 0:00  Conventional  1.106743  3812441.96\n",
       "1     Great_Lakes   1/7/19 0:00       Organic  1.371280   275987.52\n",
       "2     Great_Lakes  1/13/19 0:00  Conventional  1.063457  3843318.68\n",
       "3     Great_Lakes  1/13/19 0:00       Organic  1.493384   244991.95\n",
       "4     Great_Lakes  1/20/19 0:00  Conventional  1.049931  4587957.69\n",
       "...           ...           ...           ...       ...         ...\n",
       "6799         West      11/18/18       Organic  1.610000   334096.14\n",
       "6800         West      11/25/18  Conventional  1.240000  3260102.17\n",
       "6801         West      11/25/18       Organic  1.730000   268362.34\n",
       "6802         West       12/2/18  Conventional  1.200000  4594863.86\n",
       "6803         West       12/2/18       Organic  1.620000   268969.03\n",
       "\n",
       "[6804 rows x 5 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "avocado = pd.read_csv('https://raw.githubusercontent.com/Gurobi/modeling-examples/master/price_optimization/HABdata_2019_2022.csv') # dataset downloaded directly from HAB\n",
    "# avocado = pd.read_csv('HABdata_2019_2022.csv') # dataset downloaded directly from HAB\n",
    "avocado_old = pd.read_csv('https://raw.githubusercontent.com/Gurobi/modeling-examples/master/price_optimization/kaggledata_till2018.csv') # dataset downloaded from Kaggle\n",
    "# avocado_old = pd.read_csv('kaggledata_till2018.csv') # dataset downloaded from Kaggle\n",
    "avocado = pd.concat([avocado, avocado_old], ignore_index=True)\n",
    "avocado"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68efc9c1",
   "metadata": {},
   "source": [
    "## Prepare the Dataset\n",
    "\n",
    "We will now prepare the data for making sales predictions. Add new columns to the dataframe for the year and seasonality. Let each year from 2015 through 2022 be given an index from 0 through 7 in the increasing order of the year. We will define the peak season to be the months of February through July. These months are set based on visual inspection of the trends, but you can try setting other months."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "cd09a61a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>units_sold</th>\n",
       "      <th>price</th>\n",
       "      <th>region</th>\n",
       "      <th>year</th>\n",
       "      <th>month</th>\n",
       "      <th>year_index</th>\n",
       "      <th>peak</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>3.382800</td>\n",
       "      <td>1.020000</td>\n",
       "      <td>Great_Lakes</td>\n",
       "      <td>2015</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>2.578275</td>\n",
       "      <td>1.100000</td>\n",
       "      <td>Midsouth</td>\n",
       "      <td>2015</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>5.794411</td>\n",
       "      <td>0.890000</td>\n",
       "      <td>West</td>\n",
       "      <td>2015</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>3.204112</td>\n",
       "      <td>0.980000</td>\n",
       "      <td>Southeast</td>\n",
       "      <td>2015</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>0.321824</td>\n",
       "      <td>1.050000</td>\n",
       "      <td>Northern_New_England</td>\n",
       "      <td>2015</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3397</th>\n",
       "      <td>2022-05-15</td>\n",
       "      <td>4.150433</td>\n",
       "      <td>1.269883</td>\n",
       "      <td>SouthCentral</td>\n",
       "      <td>2022</td>\n",
       "      <td>5</td>\n",
       "      <td>7</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3398</th>\n",
       "      <td>2022-05-15</td>\n",
       "      <td>4.668815</td>\n",
       "      <td>1.644873</td>\n",
       "      <td>Northeast</td>\n",
       "      <td>2022</td>\n",
       "      <td>5</td>\n",
       "      <td>7</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3399</th>\n",
       "      <td>2022-05-15</td>\n",
       "      <td>32.745321</td>\n",
       "      <td>1.527357</td>\n",
       "      <td>Total_US</td>\n",
       "      <td>2022</td>\n",
       "      <td>5</td>\n",
       "      <td>7</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3400</th>\n",
       "      <td>2022-05-15</td>\n",
       "      <td>3.542902</td>\n",
       "      <td>1.514583</td>\n",
       "      <td>Midsouth</td>\n",
       "      <td>2022</td>\n",
       "      <td>5</td>\n",
       "      <td>7</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3401</th>\n",
       "      <td>2022-05-15</td>\n",
       "      <td>1.560202</td>\n",
       "      <td>1.541429</td>\n",
       "      <td>Plains</td>\n",
       "      <td>2022</td>\n",
       "      <td>5</td>\n",
       "      <td>7</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3402 rows × 8 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           date  units_sold     price                region  year  month  \\\n",
       "0    2015-01-04    3.382800  1.020000           Great_Lakes  2015      1   \n",
       "1    2015-01-04    2.578275  1.100000              Midsouth  2015      1   \n",
       "2    2015-01-04    5.794411  0.890000                  West  2015      1   \n",
       "3    2015-01-04    3.204112  0.980000             Southeast  2015      1   \n",
       "4    2015-01-04    0.321824  1.050000  Northern_New_England  2015      1   \n",
       "...         ...         ...       ...                   ...   ...    ...   \n",
       "3397 2022-05-15    4.150433  1.269883          SouthCentral  2022      5   \n",
       "3398 2022-05-15    4.668815  1.644873             Northeast  2022      5   \n",
       "3399 2022-05-15   32.745321  1.527357              Total_US  2022      5   \n",
       "3400 2022-05-15    3.542902  1.514583              Midsouth  2022      5   \n",
       "3401 2022-05-15    1.560202  1.541429                Plains  2022      5   \n",
       "\n",
       "      year_index  peak  \n",
       "0              0     0  \n",
       "1              0     0  \n",
       "2              0     0  \n",
       "3              0     0  \n",
       "4              0     0  \n",
       "...          ...   ...  \n",
       "3397           7     1  \n",
       "3398           7     1  \n",
       "3399           7     1  \n",
       "3400           7     1  \n",
       "3401           7     1  \n",
       "\n",
       "[3402 rows x 8 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Add the index for each year from 2015 through 2022\n",
    "avocado['date'] = pd.to_datetime(avocado['date'])\n",
    "avocado['year'] = pd.DatetimeIndex(avocado['date']).year\n",
    "avocado['year_index'] = avocado['year'] - 2015\n",
    "avocado = avocado.sort_values(by='date')\n",
    "\n",
    "# Define the peak season\n",
    "avocado['month'] = pd.DatetimeIndex(avocado['date']).month\n",
    "peak_months = range(2,8)        # <--------- Set the months for the \"peak season\"\n",
    "def peak_season(row):\n",
    "    return 1 if int(row['month']) in peak_months else 0  \n",
    "\n",
    "avocado['peak'] = avocado.apply(lambda row: peak_season(row), axis=1)\n",
    "\n",
    "# Scale the number of avocados to millions\n",
    "avocado['units_sold'] = avocado['units_sold']/1000000\n",
    "\n",
    "# Select only conventional avocados\n",
    "avocado = avocado[avocado['type'] == 'Conventional'] \n",
    "\n",
    "avocado = avocado[['date','units_sold','price','region','year','month','year_index','peak']].reset_index(drop = True)\n",
    "\n",
    "avocado"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "65bb1d21",
   "metadata": {},
   "source": [
    "## Part 1: Observe Trends in the Data\n",
    "\n",
    "Now, we will infer sales trends in time and seasonality. For simplicity, let's proceed with data from the United States as a whole."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "ab0c4402",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_Total_US = avocado[avocado['region']=='Total_US']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7903d4b5",
   "metadata": {},
   "source": [
    "### Sales Over the Years"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "2ec7e699",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(10, 5)) \n",
    "\n",
    "mean = df_Total_US.groupby('year')['units_sold'].mean()\n",
    "std  = df_Total_US.groupby('year')['units_sold'].std()\n",
    "axes.errorbar(mean.index, mean, xerr=0.5, yerr=2*std, linestyle='') \n",
    "axes.set_ylabel('Units Sold (millions)')\n",
    "axes.set_xlabel('Year') \n",
    " \n",
    "fig.tight_layout()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e37ba680",
   "metadata": {},
   "source": [
    "We can see that the sales generally increased over the years, albeit marginally. The dip in 2019 is the effect of the well-documented [2019 avocado shortage](https://abc7news.com/avocado-shortage-season-prices/5389855/) that led to avocados [nearly doubling in price.](https://abc7news.com/avocado-shortage-season-prices/5389855/)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30abfba6",
   "metadata": {},
   "source": [
    "### Seasonality\n",
    "\n",
    "We will now see the sales trends within a year."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4a594510",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(10, 5)) \n",
    "\n",
    "mean = df_Total_US.groupby('month')['units_sold'].mean()\n",
    "std  = df_Total_US.groupby('month')['units_sold'].std()\n",
    " \n",
    "axes.errorbar(mean.index, mean, xerr=0.5, yerr=2*std, linestyle='') \n",
    "axes.set_ylabel('Units Sold (millions)')\n",
    "axes.set_xlabel('Month') \n",
    " \n",
    "fig.tight_layout()\n",
    " \n",
    "plt.xlabel('Month')\n",
    "axes.set_xticks(range(1,13)) \n",
    "plt.ylabel('Units sold (millions)')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c87738d0",
   "metadata": {},
   "source": [
    "We see a Super Bowl peak in February and a Cinco de Mayo peak in May. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2e04cef1",
   "metadata": {},
   "source": [
    "### Correlations\n",
    "\n",
    "Now, we will see how the variables are correlated with each other.\n",
    "The end goal is to predict sales given the price of an avocado, year and seasonality (peak or not)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "25729f7d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1080x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(15, 5)) \n",
    "sns.heatmap(df_Total_US[['units_sold', 'price', 'year', 'peak']].corr(),annot=True, center=0,ax=axes) \n",
    "\n",
    "axes.set_title('Correlations for conventional avocados') \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fe48eecb",
   "metadata": {},
   "source": [
    "As expected, the sales quantity has a negative correlation with the price per avocado. The sales quantity has a positive correlation with the year and season being a peak season."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "27356cce",
   "metadata": {},
   "source": [
    "### Regions\n",
    "\n",
    "Finally, we will see how the sales differ among the different regions. This will determine the number of avocados that we want to supply to each region."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "081b3f31",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(10, 5)) \n",
    "\n",
    "regions = ['Great_Lakes','Midsouth','Northeast','Northern_New_England','SouthCentral','Southeast','West','Plains'] \n",
    "df = avocado[avocado.region.isin(regions)]  \n",
    "\n",
    "mean = df.groupby('region')['units_sold'].mean()\n",
    "std  = df.groupby('region')['units_sold'].std() \n",
    " \n",
    "axes.errorbar(range(len(mean)), mean, xerr=0.5, yerr=2*std, linestyle='')  \n",
    "\n",
    "fig.tight_layout()\n",
    " \n",
    "plt.xlabel('Region') \n",
    "plt.xticks(range(len(mean)), pd.DataFrame(mean)['units_sold'].index,rotation=20)\n",
    "plt.ylabel('Units sold (millions)')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d1a2716",
   "metadata": {},
   "source": [
    "Clearly, west-coasters love avocados."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b20e125e",
   "metadata": {},
   "source": [
    "## Part II: Predict the Sales\n",
    "\n",
    "The trends observed in Part I motivate us to construct a prediction model for sales using the independent variables- price, year, region and seasonality.\n",
    "Henceforth, the sales quantity will be referred to as the *predicted demand*.\n",
    "\n",
    "Let us now construct a linear regressor for the demand.\n",
    "Note that the region is a categorical variable.\n",
    "The linear regressor can be mathematically expressed as:\n",
    "\n",
    "$$demand = \\beta_0 + \\beta_1 * price + \\sum\\limits_{region} \\beta^{region}_3 * \\mathbb{1}(region)  +  \\beta_4 w_{year}*year +  \\beta_5  * \\mathbb{1}(peak).$$\n",
    "\n",
    "Here, the $\\beta$ values are weights (or \"co-efficients\") that have to be learned from the data. \n",
    "Note that the notation $\\mathbb{1}(region)$ is an indicator function that takes the value $1$ for each region in the summation. The value of $\\mathbb{1}(peak)$ is $1$ if we consider the peak season.\n",
    "\n",
    "To validate the regression model, we will randomly split the dataset into $80\\%$ training and $20\\%$ testing data and learn the weights using sklearns. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "55a07590",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The R^2 value in the test set is 0.8982069358257861\n"
     ]
    }
   ],
   "source": [
    "import statsmodels.api as sm\n",
    "import statsmodels.formula.api as smf\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import r2_score\n",
    "\n",
    "# Split the data for training and testing\n",
    "train, test = train_test_split(df, train_size=0.8, random_state=1)\n",
    "df_train = pd.DataFrame(train, columns=df.columns)\n",
    "df_test = pd.DataFrame(test, columns=df.columns)\n",
    " \n",
    "# Train the model\n",
    "formula = 'units_sold ~ price + year_index + C(region)+ peak'\n",
    "mod = smf.ols(formula,data=df_train)\n",
    "result = mod.fit()\n",
    "result.summary()\n",
    "\n",
    "# Get R^2 from test data\n",
    "y_true = df_test['units_sold']\n",
    "y_pred = result.predict(df_test)\n",
    "print(\"The R^2 value in the test set is\",r2_score(y_true, y_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e085dad",
   "metadata": {},
   "source": [
    "We can observe a good $R^2$ value in the test set. We will now train the fit the weights to the full dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "506c8804",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The R^2 value in the full dataset is 0.9066729322212482\n"
     ]
    }
   ],
   "source": [
    "formula = 'units_sold ~ price + year_index + C(region)+ peak'\n",
    "mod_full = smf.ols(formula,data=df)\n",
    "result_full = mod_full.fit()\n",
    "\n",
    "y_true_full = df['units_sold']\n",
    "y_pred_full = result_full.predict(df)\n",
    "print(\"The R^2 value in the full dataset is\",r2_score(y_true_full, y_pred_full))\n",
    "\n",
    "# Get the weights and store it\n",
    "coef_dict = result_full.params.to_dict() \n",
    "coef_dict['C(region)[T.Great_Lakes]'] = 0 "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7cbe1cd5",
   "metadata": {},
   "source": [
    "## Part III: Optimize for Price and Supply of Avocados"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "214906e5",
   "metadata": {},
   "source": [
    "Knowing how the price of an avocado affects the demand, how can we set the optimal avocado price? \n",
    "We don't want to set the price too high, since that could drive demand and sales down. At the same time, setting the price too low could be sub-optimal when maximizing revenue. So what is the sweet spot? \n",
    "\n",
    "On the distribution logistics, we want to make sure that there are enough avocados across the regions. We can address these considerations in a mathematical optimization model.\n",
    "An optimization model finds the **best solution** according to an **objective function** such that the solution satisfies a set of **constraints**. \n",
    "Here, a solution is expressed as a vector of real values or integer values called **decision variables**.\n",
    "Constraints are a set of equations or inequalities written as a function of the decision variables.\n",
    "\n",
    "At the start of each week, assume that the total number of available products is finite. This quantity needs to be distributed to the various regions while maximizing net revenue. So there are two key decisions - the price of an avocado in each region, and the number of avocados allocated to each region. \n",
    "\n",
    "Let us now define some input parameters and notations used for creating the model. The subscript $r$ will be used to denote each region.\n",
    "\n",
    "### Input Parameters\n",
    "- $R$: set of regions,\n",
    "- $d(p,r)$: predicted demand in region $r\\in R$ when the avocado per product is $p$, \n",
    "- $B$: available avocados to be distributed across the regions, \n",
    "- $c_{waste}$: cost ($\\$$) per wasted avocado,\n",
    "- $c^r_{transport}$: cost ($\\$$) of transporting a avocado to region $r \\in R$,\n",
    "- $a^r_{min},a^r_{max}$: minimum and maximum price ($\\$$) per avocado for reigon $r \\in R$,\n",
    "- $b^r_{min},b^r_{max}$: minimum and maximum number of avocados allocated to region $r \\in R$,\n",
    "\n",
    "The following code loads the Gurobi python package and initiates the optimization model. \n",
    "The value of $B$ is set to $30$ million avocados, which is close to the average weekly supply value from the data.\n",
    "For illustration, let us consider the peak season of 2021.\n",
    "The cost of wasting an avocado is set to $\\$0.10$.\n",
    "The cost of transporting an avocado ranges between $\\$0.10$ to $\\$0.50$ based on each region's distance from the southern border, where the [majority of avocado supply comes from](https://www.britannica.com/plant/avocado).\n",
    "Further, we can set the price of an avocado to not exceed $\\$ 2$ apiece. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "29328983",
   "metadata": {},
   "outputs": [],
   "source": [
    "import gurobipy as gp \n",
    "from gurobipy import GRB\n",
    "\n",
    "m = gp.Model(\"Avocado_Price_Allocation\")\n",
    "\n",
    "# Sets and parameters\n",
    "R = regions   # set of all regions\n",
    "\n",
    "B = 30  # total amount ot avocado supply\n",
    "\n",
    "peak_or_not = 1 # 1 if it is the peak season; 1 if isn't\n",
    "year = 2022\n",
    "\n",
    "c_waste = 0.1 # the cost ($) of wasting an avocado\n",
    "c_transport = {'Great_Lakes': .3,'Midsouth':.1,'Northeast':.4,'Northern_New_England':.5,'SouthCentral':.3,'Southeast':.2,'West':.2,'Plains':.2}\n",
    "# the cost of transporting an avocado\n",
    "\n",
    "# Get the lower and upper bounds from the dataset for the price and the number of products to be stocked \n",
    "a_min = {r: 0 for r in R} # minimum avocado price in each region \n",
    "a_max = {r: 2 for r in R} # maximum avocado price in each region \n",
    "b_min = dict(df.groupby('region')['units_sold'].min())  # minimum number of avocados allocated to each region\n",
    "b_max = dict(df.groupby('region')['units_sold'].max())   # maximum number of avocados allocated to each region"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1fa17930",
   "metadata": {},
   "source": [
    "### Decision Variables\n",
    "\n",
    "Let us now define the decision variables.\n",
    "In our model, we want to store the price and number of avocados allocated to each region. We also want variables that track how many avocados are predicted to be sold and how many are predicted to be wasted. \n",
    "The following notation is used to model these decision variables, indexed for each region $r$.\n",
    "\n",
    "$p_r$: the price of an avocado ($\\$$) in region $r$,\n",
    "\n",
    "$x_r$: the number of products avocados supplied to region $r$,\n",
    "\n",
    "$s_r = \\min \\{x_r,d_r(p_r)\\}$: the predicted number of avocados sold in region $r$, \n",
    "\n",
    "$w_r = x_r - s_r$: the predicted number of avocados wasted in region $r$\n",
    "\n",
    "We will now add the variables to the Gurobi model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "0bb7f0f8",
   "metadata": {},
   "outputs": [],
   "source": [
    "p = m.addVars(R,name=\"p\",lb=a_min, ub=a_max)   # price of avocados in each region\n",
    "x = m.addVars(R,name=\"x\",lb=b_min,ub=b_max)  # quantity supplied to each region\n",
    "s = m.addVars(R,name=\"s\",lb=0)   # predicted amount of sales in each region for the given price\n",
    "w = m.addVars(R,name=\"w\",lb=0)   # excess wasteage in each region"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "389ffd60",
   "metadata": {},
   "source": [
    "Now, let's create an expression for the predicted demand in each region as a function of price. Note that apart from the price, none of the other parameters in this prediction function (such as region, year and seasonality) are decision variables, and hence can be treated as constants."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "8960e806",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7.113205674224982 + -2.203770104890244 <gurobi.Var *Awaiting Model Update*>\n",
      "6.870512520547104 + -2.203770104890244 <gurobi.Var *Awaiting Model Update*>\n",
      "8.54622551086822 + -2.203770104890244 <gurobi.Var *Awaiting Model Update*>\n",
      "4.093961883587102 + -2.203770104890244 <gurobi.Var *Awaiting Model Update*>\n",
      "8.827017748198438 + -2.203770104890244 <gurobi.Var *Awaiting Model Update*>\n",
      "7.697195840886147 + -2.203770104890244 <gurobi.Var *Awaiting Model Update*>\n",
      "9.715005122866248 + -2.203770104890244 <gurobi.Var *Awaiting Model Update*>\n",
      "5.2981728018345695 + -2.203770104890244 <gurobi.Var *Awaiting Model Update*>\n"
     ]
    }
   ],
   "source": [
    "d = {r: (coef_dict['Intercept']+coef_dict['price']*p[r] + coef_dict['C(region)[T.%s]'%r] + coef_dict['year_index']*(year-2015) + coef_dict['peak']*peak_or_not) for r in R}\n",
    "for r in R:\n",
    "    print(d[r])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3d733d6f",
   "metadata": {},
   "source": [
    "### Set the Objective\n",
    "\n",
    "Next, we will define the objective function: we want to maximizing the **net revenue**. The revenue from sales in each region is calculated by the price of an avocado in that region multiplied by the quantity sold there. There are two types of costs incurred: the wastage costs for excess unsold avocados and the cost of transporting the avocados to the different regions. \n",
    "\n",
    "The net revenue is the sales revenue subtracted by the total costs incurred. We assume that the purchase costs are fixed and are not incorporated in this model.\n",
    "\n",
    "Using the defined decision variables, the objective can be written as follows.\n",
    "\n",
    "\\begin{align}\n",
    "\\textrm{maximize} &  \\sum_{r}  (p_r * s_r - c_{waste} * w_r - c^r_{transport} * x_r)& \n",
    "\\end{align}\n",
    "\n",
    "Let us now add the objective function to the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "bb5e1218",
   "metadata": {},
   "outputs": [],
   "source": [
    "m.setObjective(sum(p[r]*s[r] - c_waste*w[r] - c_transport[r]*x[r] for r in R)) \n",
    "m.ModelSense = GRB.MAXIMIZE"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "93a8432c",
   "metadata": {},
   "source": [
    "### Add the Supply Constraint\n",
    "\n",
    "We now introduce the constraints. The first constraint is to make sure that the total number of avocados supplied is equal to $B$, which can be mathematically expressed as follows.\n",
    "\n",
    "\\begin{align*} \n",
    "\\sum_{r} x_r &= B\n",
    "\\end{align*}\n",
    "\n",
    "The following code adds this constraint to the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "84bd6017",
   "metadata": {},
   "outputs": [],
   "source": [
    "m.addConstr(sum(x[r] for r in R) == B)\n",
    "m.update()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "380cbfab",
   "metadata": {},
   "source": [
    "### Add Constraints That Define Sales Quantity\n",
    "\n",
    "Next, we should define the predicted sales quantity in each region.\n",
    "We can assume that if we supply more than the predicted demand, we sell exactly the predicted demand. \n",
    "Otherwise, we sell exactly the allocated amount.\n",
    "Hence, the predicted sales quantity is the minimum of the allocated quantity and the predicted demand, i.e., $s_r = \\min \\{x_r,d_r(p_r)\\}$. \n",
    "This relationship can be modeled by the following two constraints for each region $r$.\n",
    "\n",
    "\\begin{align*} \n",
    "s_r &\\leq x_r  \\\\\n",
    "s_r &\\leq d(p_r,r)  \n",
    "\\end{align*}\n",
    "\n",
    "These constraints will ensure that the sales quantity $s_r$ in region $r$ is  greater than neither the allocated quantity nor the predicted demand. Note that the maximization objective function tries to maximize the revenue from sales, and therefore the optimizer will maximize the predicted sales quantity. This is assuming that the surplus and transportation costs are less than the sales price per avocado. Hence, these constraints along with the objective will ensure that the sales are equal to the minimum of supply and predicted demand.\n",
    "\n",
    "Let us now add these constraints to the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "ca72fc5b",
   "metadata": {},
   "outputs": [],
   "source": [
    "m.addConstrs((s[r] <= x[r] for r in R))\n",
    "m.addConstrs((s[r] <= d[r] for r in R)) \n",
    "m.update()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d0875f6c",
   "metadata": {},
   "source": [
    "### Add the Wastage Constraints\n",
    "\n",
    "Finally, we should define the predicted wastage in each region, given by the supplied quantity that is not predicted to be sold. We can express this mathematically for each region $r$.\n",
    "\n",
    "\\begin{align*} \n",
    "w_r &= x_r - s_r\n",
    "\\end{align*} \n",
    "\n",
    "We can add these constraints to the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "38ac8066",
   "metadata": {},
   "outputs": [],
   "source": [
    "m.addConstrs((w[r] == x[r]-s[r] for r in R))\n",
    "m.update()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dab6884c",
   "metadata": {},
   "source": [
    "### Fire Up the Solver\n",
    "\n",
    "We have added the decision variables, objective function, and the constraints to the model. \n",
    "The model is ready to be solved.\n",
    "Before we do so, we should let the solver know what type of model this is.\n",
    "The default setting assumes that the objective and the constraints are linear functions of the variables.\n",
    "\n",
    "In our model, the objective is **quadratic** since we take the product of price and the predicted sales, both of which are variables. \n",
    "Maximizing a quadratic term is said to be **non-convex**, and we specify this using a Gurobi parameter value to be $2$. \n",
    "See [here](https://www.gurobi.com/documentation/9.5/refman/nonconvex.html) for more details."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "ac3c5eca",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Set parameter NonConvex to value 2\n",
      "Gurobi Optimizer version 10.0.2 build v10.0.2rc0 (win64)\n",
      "\n",
      "CPU model: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz, instruction set [SSE2|AVX|AVX2|AVX512]\n",
      "Thread count: 4 physical cores, 8 logical processors, using up to 8 threads\n",
      "\n",
      "Optimize a model with 25 rows, 32 columns and 64 nonzeros\n",
      "Model fingerprint: 0xdd95f932\n",
      "Model has 8 quadratic objective terms\n",
      "Coefficient statistics:\n",
      "  Matrix range     [1e+00, 2e+00]\n",
      "  Objective range  [1e-01, 5e-01]\n",
      "  QObjective range [2e+00, 2e+00]\n",
      "  Bounds range     [2e-01, 1e+01]\n",
      "  RHS range        [4e+00, 3e+01]\n",
      "\n",
      "Continuous model is non-convex -- solving as a MIP\n",
      "\n",
      "Presolve removed 8 rows and 8 columns\n",
      "Presolve time: 0.00s\n",
      "Presolved: 34 rows, 33 columns, 81 nonzeros\n",
      "Presolved model has 8 bilinear constraint(s)\n",
      "Variable types: 33 continuous, 0 integer (0 binary)\n",
      "\n",
      "Root relaxation: objective 5.288486e+01, 36 iterations, 0.00 seconds (0.00 work units)\n",
      "\n",
      "    Nodes    |    Current Node    |     Objective Bounds      |     Work\n",
      " Expl Unexpl |  Obj  Depth IntInf | Incumbent    BestBd   Gap | It/Node Time\n",
      "\n",
      "     0     0   52.88486    0    8          -   52.88486      -     -    0s\n",
      "H    0     0                      29.5452368   52.88486  79.0%     -    0s\n",
      "H    0     0                      42.5082914   52.88486  24.4%     -    0s\n",
      "     0     0   47.12254    0    8   42.50829   47.12254  10.9%     -    0s\n",
      "     0     0   43.44074    0    8   42.50829   43.44074  2.19%     -    0s\n",
      "     0     0   42.65013    0    8   42.50829   42.65013  0.33%     -    0s\n",
      "     0     0   42.55582    0    8   42.50829   42.55582  0.11%     -    0s\n",
      "     0     0   42.52209    0    8   42.50829   42.52209  0.03%     -    0s\n",
      "     0     0   42.51999    0    8   42.50829   42.51999  0.03%     -    0s\n",
      "     0     0   42.51400    0    8   42.50829   42.51400  0.01%     -    0s\n",
      "     0     2   42.51400    0    8   42.50829   42.51400  0.01%     -    0s\n",
      "\n",
      "Cutting planes:\n",
      "  RLT: 16\n",
      "\n",
      "Explored 7 nodes (104 simplex iterations) in 0.06 seconds (0.00 work units)\n",
      "Thread count was 8 (of 8 available processors)\n",
      "\n",
      "Solution count 2: 42.5083 29.5452 \n",
      "\n",
      "Optimal solution found (tolerance 1.00e-04)\n",
      "Best objective 4.250829142540e+01, best bound 4.251093705635e+01, gap 0.0062%\n"
     ]
    }
   ],
   "source": [
    "m.Params.NonConvex = 2 \n",
    "m.optimize() "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aed67953",
   "metadata": {},
   "source": [
    "The solver solved the optimization problem in less than a second.\n",
    "Let us now analyze the optimal solution by storing it in a Pandas dataframe."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "3f7ff154",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " The optimal net revenue: $42.508291 million\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Region</th>\n",
       "      <th>Price</th>\n",
       "      <th>Allocated</th>\n",
       "      <th>Sold</th>\n",
       "      <th>Wasted</th>\n",
       "      <th>Pred_demand</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Great_Lakes</td>\n",
       "      <td>1.663872</td>\n",
       "      <td>3.446414</td>\n",
       "      <td>3.446414</td>\n",
       "      <td>1.000000e-08</td>\n",
       "      <td>3.446414</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Midsouth</td>\n",
       "      <td>1.508809</td>\n",
       "      <td>5.272290</td>\n",
       "      <td>3.545445</td>\n",
       "      <td>1.726845e+00</td>\n",
       "      <td>3.545445</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Northeast</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>4.138685</td>\n",
       "      <td>4.138685</td>\n",
       "      <td>1.000000e-08</td>\n",
       "      <td>4.138685</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Northern_New_England</td>\n",
       "      <td>1.441157</td>\n",
       "      <td>0.917984</td>\n",
       "      <td>0.917984</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>0.917984</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>SouthCentral</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>4.419478</td>\n",
       "      <td>4.419478</td>\n",
       "      <td>1.000000e-08</td>\n",
       "      <td>4.419478</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Southeast</td>\n",
       "      <td>1.746370</td>\n",
       "      <td>3.848598</td>\n",
       "      <td>3.848598</td>\n",
       "      <td>2.000000e-08</td>\n",
       "      <td>3.848598</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>West</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>5.307465</td>\n",
       "      <td>5.307465</td>\n",
       "      <td>2.000000e-08</td>\n",
       "      <td>5.307465</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Plains</td>\n",
       "      <td>1.202070</td>\n",
       "      <td>2.649086</td>\n",
       "      <td>2.649086</td>\n",
       "      <td>2.000000e-08</td>\n",
       "      <td>2.649086</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 Region     Price  Allocated      Sold        Wasted  \\\n",
       "0           Great_Lakes  1.663872   3.446414  3.446414  1.000000e-08   \n",
       "1              Midsouth  1.508809   5.272290  3.545445  1.726845e+00   \n",
       "2             Northeast  2.000000   4.138685  4.138685  1.000000e-08   \n",
       "3  Northern_New_England  1.441157   0.917984  0.917984  0.000000e+00   \n",
       "4          SouthCentral  2.000000   4.419478  4.419478  1.000000e-08   \n",
       "5             Southeast  1.746370   3.848598  3.848598  2.000000e-08   \n",
       "6                  West  2.000000   5.307465  5.307465  2.000000e-08   \n",
       "7                Plains  1.202070   2.649086  2.649086  2.000000e-08   \n",
       "\n",
       "   Pred_demand  \n",
       "0     3.446414  \n",
       "1     3.545445  \n",
       "2     4.138685  \n",
       "3     0.917984  \n",
       "4     4.419478  \n",
       "5     3.848598  \n",
       "6     5.307465  \n",
       "7     2.649086  "
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "solution = pd.DataFrame() \n",
    "solution['Region'] = R\n",
    "solution['Price'] = [p[r].X for r in R]\n",
    "solution['Allocated'] = [round(x[r].X,8) for r in R]\n",
    "solution['Sold'] = [round(s[r].X,8) for r in R]\n",
    "solution['Wasted'] = [round(w[r].X,8) for r in R]  \n",
    "solution['Pred_demand'] = [(coef_dict['Intercept']+coef_dict['price']*p[r].X + coef_dict['C(region)[T.%s]'%r] + coef_dict['year_index']*(year-2015) + coef_dict['peak']*peak_or_not) for r in R]\n",
    "\n",
    "opt_revenue = m.ObjVal\n",
    "print(\"\\n The optimal net revenue: $%f million\"%opt_revenue) \n",
    "solution"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f475012d",
   "metadata": {},
   "source": [
    "Let us now visualize a scatter plot between the price and the number of avocados sold (in millions) for the eight regions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "551f4eb6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The circles represent sales quantity and the cross markers represent the wasted quantity.\n"
     ]
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1,1) \n",
    "plot_sol = sns.scatterplot(data=solution,x='Price',y='Sold',hue='Region',s=100)\n",
    "plot_waste = sns.scatterplot(data=solution,x='Price',y='Wasted',marker='x',hue='Region',s=100,legend = False)\n",
    "\n",
    "plot_sol.legend(loc='center left', bbox_to_anchor=(1.25, 0.5), ncol=1)\n",
    "plot_waste.legend(loc='center left', bbox_to_anchor=(1.25, 0.5), ncol=1)\n",
    "plt.ylim(0, 5)\n",
    "plt.xlim(1, 2.2)\n",
    "ax.set_xlabel('Price per avocado ($)')\n",
    "ax.set_ylabel('Number of avocados sold (millions)')\n",
    "plt.show() \n",
    "print(\"The circles represent sales quantity and the cross markers represent the wasted quantity.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ed0d2b24",
   "metadata": {},
   "source": [
    "## Experiment with Parameter Settings\n",
    "\n",
    "While this notebook walked through how to build an optimization model piece-by-piece, the following code contains the overall optimization model. You can input different parameter values and see how the optimal solution changes. \n",
    "The value of $B$ can be controlled using the slider below the cell.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "26fc6a49",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Select a value for the available inventory (B) (in millions):\n",
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e249ea3692fa4d049b030daa42c3ba9a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(IntSlider(value=27, description='x', max=40, min=15), Output()), _dom_classes=('widget-i…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<function __main__.solve_MIQP(x)>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from ipywidgets import interact, interactive, fixed, interact_manual\n",
    "import ipywidgets as widgets \n",
    " \n",
    "import plotly.express as px\n",
    "\n",
    "peak_or_not = 1 # \n",
    "year = 2021\n",
    "\n",
    "# Sets and parameters\n",
    "R = regions  \n",
    "c_waste = 0.1 \n",
    "c_transport = {'Great_Lakes': .3,'Midsouth':.1,'Northeast':.4,'Northern_New_England':.5,'SouthCentral':.3,'Southeast':.2,'West':.2,'Plains':.2}\n",
    "\n",
    "# Get the lower and upper bounds for price (p) and amount to be stocked (x) from the dataset\n",
    "price_min = dict(df.groupby('region')['price'].min())\n",
    "price_max = dict(df.groupby('region')['price'].max())\n",
    "sold_min = dict(df.groupby('region')['units_sold'].min()) \n",
    "sold_max = dict(df.groupby('region')['units_sold'].max())   \n",
    "\n",
    "\n",
    "\n",
    "def solve_MIQP(x):\n",
    "    B = x\n",
    "    \n",
    "    # Initialize Model\n",
    "    m = gp.Model(\"Avocado_Price_Allocation\")\n",
    "\n",
    "    # Variables. Adjust the bounds here \n",
    "    x = m.addVars(R,name=\"x\",lb=sold_min,ub=sold_max) \n",
    "    p = m.addVars(R,name=\"p\",lb=0, ub=2)   \n",
    "    s = m.addVars(R,name=\"s\",lb=0)  \n",
    "    w = m.addVars(R,name=\"w\",lb=0) \n",
    "    i = m.addVars(R,name=\"i\",vtype=GRB.BINARY) \n",
    "\n",
    "    # Predictor expression for demand\n",
    "    d = {r: (coef_dict['Intercept']+coef_dict['price']*p[r] + coef_dict['C(region)[T.%s]'%r] + coef_dict['year_index']*(year-2015) + coef_dict['peak']*peak_or_not) for r in R}\n",
    " \n",
    "    \n",
    "    # Set the objective\n",
    "    m.ModelSense = GRB.MAXIMIZE\n",
    "    m.setObjective(sum(p[r]*s[r] - c_waste*w[r] - c_transport[r]*x[r] for r in R)) \n",
    "\n",
    "    # Add the constraints \n",
    "    m.addConstrs((s[r] <= x[r] for r in R))\n",
    "    m.addConstrs((s[r] <= d[r] for r in R)) \n",
    "    m.addConstrs((x[r] == w[r]+s[r] for r in R))\n",
    "    m.addConstr(sum(x[r] for r in R) == B)\n",
    "\n",
    "    # Solve   \n",
    "    m.setParam('OutputFlag', 0)\n",
    "    m.Params.NonConvex = 2\n",
    "    m.update()\n",
    "    m.optimize() \n",
    "    if m.status == 4:\n",
    "        print('The problem is infeasible. Try changing the parameter values.')\n",
    "    else:\n",
    "        global solution, opt_revenue\n",
    "        solution = pd.DataFrame() \n",
    "        solution['Region'] = R\n",
    "        solution['Price'] = [p[r].X for r in R]\n",
    "        solution['Allocated'] = [round(x[r].X,8) for r in R]\n",
    "        solution['Sold'] = [round(s[r].X,8) for r in R]\n",
    "        solution['Wasted'] = [round(w[r].X,8) for r in R]  \n",
    "        solution['Demand'] = [(coef_dict['Intercept']+coef_dict['price']*p[r].X + coef_dict['C(region)[T.%s]'%r] + coef_dict['year_index']*(year-2015) + coef_dict['peak']*peak_or_not) for r in R]\n",
    "\n",
    "        opt_revenue = m.ObjVal\n",
    "        if display_figures:\n",
    "            print(\"\\n Net revenue: $%f million\"%opt_revenue)\n",
    "            print(\"\\nThe optimal solution is as follows. Price per avocado in dollars. Allocated avocados, wasted avocados, and predicted demand in millions.\\n\")\n",
    "            print(solution)\n",
    "            \n",
    "            print(\"\\n Scatter plot of price vs number of avocados sold (millions) for the eight regions:\")\n",
    "            fig, ax = plt.subplots(1,1) \n",
    "            plot_sol = sns.scatterplot(data=solution,x='Price',y='Sold',hue='Region',s=100)\n",
    "            plot_waste = sns.scatterplot(data=solution,x='Price',y='Wasted',marker='x',hue='Region',s=100,legend = False)\n",
    "\n",
    "            plot_sol.legend(loc='center left', bbox_to_anchor=(1.25, 0.5), ncol=1)\n",
    "            plot_waste.legend(loc='center left', bbox_to_anchor=(1.25, 0.5), ncol=1)\n",
    "            plt.ylim(0, 5)\n",
    "            plt.xlim(1, 2.2)\n",
    "            ax.set_xlabel('Price per avocado ($)')\n",
    "            ax.set_ylabel('Number of avocados sold (millions)')\n",
    "            plt.show() \n",
    "            print(\"The circles represent sales quantity and the cross markers represent the wasted quantity.\")\n",
    "            \n",
    "            \n",
    "        return m.ObjVal, solution\n",
    "        \n",
    "        \n",
    "display_figures = 1\n",
    "print(\"Select a value for the available inventory (B) (in millions):\\n\")\n",
    "interact(solve_MIQP, x=(15,40,1))\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d05d06ab",
   "metadata": {},
   "source": [
    "**Observations**:\n",
    "- When the supply is highly constrained, i.e., for a very small B, the model sets high prices => demand is low => allocation satisfies the demand exactly\n",
    "- With increasing supply => the prices go down => demand goes up => the allocation can continue to satisfy demand\n",
    "- With a very high supply, the wasteage starts going up\n",
    " "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "749247cc",
   "metadata": {},
   "source": [
    "## Compare Optimal Versus Actual Net Revenue"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "92429363",
   "metadata": {},
   "source": [
    "Finally, we can run the optimization model for each week in a year and compare the optimal predicted revenue with the actual weekly revenue.\n",
    "Let us assume that there were no wastage costs in the actual weekly number since this information is unknown. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "96ba33e0",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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iJEjR2755JNPFi5fvnzhzp07s6688sr8qrbbtGlT9pQpU9pHbnfr1m3fc88993HiI677yj92lSktLaWkpCQZISVMrAlioZn93cy+HTY3jzaz0QmNTEREJJO8NaUNt/fozy9aDeb2Hv15a0qbg9ndP//5z+aNGjUqvfLKKzcBNGjQgPvuu2/l3//+93bbt2/Pmjx5ctsRI0Z86fjjj+/erVu3fj/+8Y87Avz4xz/utHLlyka9evXqc8kll3RaunRpw+7du/eFoAJ30kknfWn48OFH5Ofn97/11lvzfvGLX3To3bt3n4EDB/Zat25dNsAdd9zRrl+/fr179uzZ59RTT/3S9u3bK80niouL6dSpU//S0lI2btyYnZWVNfjZZ59tBjB48OCeCxcubLRt27assWPHduvXr1/v3r1793nkkUdaRba95JJLOvXr1693jx49+kyaNKld+f3PmTOnSe/evfssWrSoYWTZ5s2bs/Lz8/sXFRUZwOeff17mdsSYMWO6XXjhhZ0HDRrUq1OnTv2nTp3aOnLfz3/+8w6R406YMOHQih676H0tXbq04eGHH9533LhxXfr27dvno48+aljRPi699NL86Crk1VdffehNN93UobJjRvZ7zjnndD3iiCP6Hnvssd137NhhAEOGDOk5d+7cJgBr1qxpkJ+f3z/Wx606sSaILYBdwCnAN8Ofb8R7MBERkXrprSlteP66ruxY1xAcdqxryPPXdT2YJPG9997LHThw4K7oZW3atCnt2LHj3kWLFjUCWLBgQdMnnnji44ULF74/c+bMNnPnzm1yxx13fNa5c+eiJUuWLLr//vs/K7/fDz74IPepp576+K233lr8m9/8Jr9JkyalixcvXlRQULDz/vvvbwtw3nnnbV64cOHipUuXLurZs+fuyZMnV5qANGjQgMMOO2zP22+/3fiFF15o1qdPn12zZ89utnv3blu7dm3Dfv36Ff3sZz/reOKJJ25buHDh4v/85z9Lb7jhhk7btm3Luuuuu9q1bNmyZOHChYvnz5+/+KGHHspbsmTJ/kTwhRdeaHrZZZd1nTlz5rI+ffrsjSxv3bp16dChQ7c//vjjLQEefPDBNl/72tc2N2rU6At9RtetW5dTWFi4ZMaMGR/edNNN+QBPP/10i2XLljVesGDB4sWLFy969913mzz77LPNqnvsVqxY0fiiiy7atHjx4kULFy5sXNE+xo0b9/lTTz21/3mfMWNG63Hjxm2u7JgAn376aeMrrrhi/bJly95v2bJlycMPP9y6/LGjVfe4xSLWibIvimenAGbWGJgLNAqP86S732RmkwgSzL3AR8BF7r4l3v2LiIjUGXNuy6e4qGxRprgoizm35XPU9z6vyS7dHTP7QsITLgfguOOO23bIIYeUAHz961/fPHv27GZnn332lqr2e8wxx2xv3bp1aevWrUubNWtWMnbs2C0A/fv337VgwYImAPPmzcu98cYb87dv3569c+fO7GHDhm2tbp8vvfRS8+XLlze65ppr1kyZMiVv7ty5OwYOHLgTYPbs2S2ef/75VpMnTz4EoKioyJYtW9bwxRdfbLFkyZImM2fObA2wffv27EWLFjVu2LChL1u2rPFll13W7YUXXvigW7du+8ofc/z48Rtuu+22Q84///wtjzzySLs//elPKyqKbeTIkVuys7MZPHjwnk2bNuUAPPfccy3mzp3bok+fPn0Adu3albVkyZLGhx9++N6K9hHRsWPHvSNGjNhZ1T4mTJiwcdOmTQ1WrFiRs2bNmgYtW7Ys6d69+95Jkya1r+yY+fn5Rcccc8xugEGDBu1asWJFo6riqOxx69WrV5XxR6syQTSzn7r7b83sD0BFL8Irqti8CBju7jvMLAd41cyeBV4ArnP3YjO7DbgO+L9YAxYREalzdqyvuHpT2fIY9O/ff/eMGTPKVJI+//zzrLVr1zbs3bt30euvv94kkihGlL9dkYYNG+7/vM/KyqJx48Ye+bu4uNgAxo8ff9iTTz65bOjQobsnT57cds6cOc2r2ucJJ5yw449//GPeunXrGt55552rfve73x3y0ksvNT/uuOO2Q5DUPvnkk8sGDhxYFL2du9sdd9zx6ZgxY8rMnDJr1qzm7du331dUVJT1+uuvN+nWrdsXEtRTTjll5+WXX97omWeeaVZSUmJHHXXUnopii5xfJI7I76uuumrNNddcszF63aVLl1b5fDVp0qQ0el8V7QPgm9/85uZHHnmk9dq1a3PGjBnzeXXHjH5OsrOzfffu3VkADRo08Ehfx127du1/cit73OJRXRNzZGBKITCvgp9KeSByib6c8Mfd/d/uXhwufx3oVOEOREREMkWz9hVXbipbHoORI0du37NnT9bdd9/dFoJ+Z5dddlnnsWPHbmzevHkpwKuvvtpi3bp12Tt27LB//etfrYYNG7ajZcuWJTt37jyoeZB37dqV1aVLl31FRUX22GOPVdtMfsIJJ+x8++23m2VlZXmTJk28b9++ux5++OG8E088cQfAiSeeuO2OO+7oUFoa5FevvfZaLsDJJ5+89d57782L9B1csGBBo23btmUBtGjRouTZZ5/98KabbsqfNWtWhQnqOeecs+miiy46fNy4cV9I0qpy+umnb5s2bVq7rVu3ZgEsX748Z9WqVQ3ieewq2wfA+eef//lTTz3VZtasWa3HjRu3ubr1K9O5c+eiN998synAo48+uv/LQlWPW6yqPLC7/zP8/VA8O40ws2yCRPII4B53f6PcKt8F/l6TfYuIiNQZw/5vFc9f17VMM3ODRqUM+79VNd1lVlYW06dPXzZ+/PiukyZN6lhaWsrw4cO3Tp48ef8+CwoKdpx99tmHrVixovGYMWM2ffWrX90FMHjw4B3du3fvO3z48K1XX311hZdaq8q11167esiQIb3z8/P39u7de9eOHTuyq1o/NzfXDznkkL0FBQU7AY4//vgdM2fObDNkyJDdABMnTlw9fvz4Lr169erj7tapU6eiV155ZdmECRM2rlixolH//v17u7u1adNm37/+9a+PIvvt3Llz8axZs5adfvrp3Zs0abKi/HG/973vbbrtttvyv/e9+JrxR48eve39999vfNRRR/WCoDL46KOPLu/bt29R9GNXUT/E6vaRn59fXFBQsGfnzp1ZHTp02Nu1a9d9Va3foEGDSufavPbaa9edffbZhz/22GNtjz/++P3Vwuoet1hYpJyaSGbWCvgHcLm7LwyXXQ8UAKO9giDMbDwwHqBLly6DP/nkk4THKSKSScxsnrsXpDqOTDV//vwVAwcOjL0y9daUNsy5LZ8d6xvSrP1ehv3fqpr2P4zF5MmT2xYWFjZ9+OGHP03UMdLd1KlTW8+YMaPV9OnTl6c6lnQ0f/78dgMHDuxW0X1JuRazu28xs9nAacBCM7uAYBT0iIqSw3CbB4AHAAoKCjRTvaSV6e+sYtLzS1m9ZTeHtsrlmlN7MmpQlVOPiUh9d9T3Pk9kQihlXXDBBZ1feeWVlrNmzfow1bHURQlLEM0sD9gXJoe5wEnAbWZ2GsGglGHuvqvKnYikoenvrOK6p99j976gY/CqLbu57un3AKpMEpVUikgyXXHFFZuATamOI1UeeuihlcDKVMdRV8WUIJpZD+BeoIO79zOzAQSX3vtVFZt1BB4K+yFmAY+7+ywzW0Yw9c0L4Wiq1939Bwd1FiJREp2ITXp+6f7kMGL3vhImPb+00uPUNKkUERFJhVgriH8CrgHuB3D3BWb2V6DSBNHdFwCDKlj+hWsnitSWZCRiq7fsjms51CypTBZVNkVEpLxYhzw3cfc3yy0rrnBNkRSqKhGrLYe2yo1rOdQsqUyGSEK9astunAMJ9fR3ajywUkREMkCsCeJGM/sS4WTZZnYmsCZhUYnUUDISsWtO7UluTtkZHXJzsrnm1J6VblOTpDIZkpFQi4hI3RNrgvhDgublXma2CrgKuDRRQYnUVDISsVGD8vnN6P7kt8rFgPxWufxmdP8qm2VrklQmQ7pWNkUkdg8//HArMxv8zjvvNK5u3VtuuaX99u3bazxJ9uTJk9t+5zvf6VLT7WO1dOnSht27d+9bfvmsWbOan3jiiQntqnbttdceksj91xUxvUjc/WN3PwnIA3q5+3HuviKhkYnUQLISsVGD8nnt2uEsn/h1Xrt2eLV99mqSVCZDulY2RSR2jz32WJsvf/nLO6ZNm1btFU3uv//+Djt27Dioq6hkusmTJ3eMZb3i4szuaRfTi8TMbjSzG4EfAxOibouklZomYtPfWcWxE1/msGuf4diJLyekD168SWUypGtlUyQTPfL6J22G/PrF/odd+8zgIb9+sf8jr39SbUJXna1bt2YVFhY2mzp16op//OMf+y+1VlxczPjx4zv16NGjT48ePfr8+te/bv+rX/2q/fr163OGDRvW4ytf+UoPgCZNmuwfTDp16tTWY8aM6Qbw17/+teWAAQN69e7du88xxxzTY+XKlVUOau3Ro0efjRs3ZpeWltKqVasjI5f/GzVq1GHTp09vXlxczCWXXNKpX79+vXv06NFn0qRJ7SLb/vznP+8QWT5hwoRDy+970aJFDXv37t1nzpw5TSLLSkpK6Nq1a7/Vq1c3iNzu0qVLvzVr1pSJ8+qrrz507Nix3YYMGdKzU6dO/X/1q1+1j9z3xz/+sU3//v179+rVq8+5557bNbxUYX5RUVFWr169+owcOfKw8rE0adJk0FVXXXXogAEDer300kvNKtrHbbfdlveDH/xg/2WEJ0+e3PaCCy7oXNkxI/u9/PLL83v27Nln4MCBvSKP95gxY7pNnTq1dfTxY33cDlas3yJ2Rv2UAKcD3Wo7GJHaEG8iVp8HaqRrZVMk0zzy+idtfjlrUdf124saOrB+e1HDX85a1PVgk8RHH3201QknnLB1wIABRa1atSp59dVXmwDccccdeZ988kmj999/f9EHH3yw6OKLL950ww03rG/fvv2+OXPmfPDGG298UNV+Tz755B3vvvvuksWLFy8688wzP7/llluqbHYtKCjY8eKLLzabN29e406dOhW9+uqrzQDeeeedpieeeOLOu+66q13Lli1LFi5cuHj+/PmLH3roobwlS5Y0fPrpp1ssW7as8YIFCxYvXrx40bvvvtvk2WefbRbZ7/z58xuNGTPmiClTpiwfNmzY/rmTs7OzOfPMMzf9+c9/bgMwY8aMFr17997dsWPHL5T1li1b1njOnDkfvPXWW4tvv/32Q4uKiuztt99u/OSTT7YpLCxcsmTJkkVZWVl+3333tf3jH/+4qlGjRqVLlixZNHPmzC9cfWX37t1Z/fr1271gwYIleXl5xRXt4/zzz9/8r3/9q1VkmyeffLLNueeeu7myY0b2O3To0B1Lly5dNHTo0B1/+MMf8qp6vKt73GpDTNPcuPsd0bfN7HZgZm0GIpIq6TwFTTKMGpRfL85TJJUmv/RhflFxaZmiTFFxadbklz7MH3d01xpfXeXxxx9vc+WVV64HGDNmzOfTpk1rc9xxx+16+eWXW/zgBz/YkJOTA0CHDh1KqtxROcuXL284atSoThs2bMjZu3dvVufOnYuqWv/444/fMWfOnGYrVqxoePHFF6+fOnVq3vLly3NatmxZ3LJly9IXX3yxxZIlS5rMnDmzNcD27duzFy1a1Pi5555rMXfu3BZ9+vTpA7Br166sJUuWND788MP3fv755w1GjRp1xBNPPPFRQUHBnvLHvPTSSzeOHDnyiBtvvHH9gw8+2O7CCy+s8LKHp5xyypbc3FzPzc0tbtOmzb7PPvuswXPPPdd84cKFTQYOHNgbYM+ePVnt27evts04OzubCy+8cDNAZfs49NBDizt37lz00ksvNe3bt++ejz/+uPHJJ5+8Y+LEiXmVHTMnJ8fPOeecrQCDBw/e+eKLL7aoKo7KHrfTTz99R3XnEKuaXkmlCXB4bQUhkkoaqJGeND+jZJIN24saxrM8FmvXrs1+/fXXW3zwwQe5P/rRjygpKTEz83vvvfczd8fMqr1MbXjBCgB27969/8aPfvSjLldeeeXa8847b+usWbOa33LLLVU2YZ588snbH3jggfafffZZ0W233bZq5syZrR955JHWRx999A4Ad7c77rjj0zFjxmyL3u7ZZ59tcdVVV6255ppryiR3S5cubdi8efOSjh077p09e3azihLEI444Yl+7du2KZ86c2fydd95pOn369I8riq1Ro0b7H4fs7GyKi4vN3W3s2LGb7rnnnriaiho2bFjaoEGQOlW1jzPPPHPz3/72t9a9evXac/rpp2/Oysqqcv0GDRp4VlZW5G+Ki4stsrykJMjtS0tL2bdvn4XHpqLHrTbF2gfxPTNbEP68DywFfp+ooCRzJaOvX7w0UCP9JKvZPx1fj5KZ8po32hvP8lhMmzat9ejRozetXr36vVWrVr23du3aBZ06ddr773//u9lJJ5207b777svbt28fAOvWrcsGaNq0acnWrVv3f/a3bdt239tvv924pKSEGTNm7O/rtn379uwuXbrsA/jLX/7StrpYjjjiiH2bN29usHz58sZ9+vTZO3To0B333HPPIV/96ld3AJx88slb77333ryioiIDWLBgQaNt27ZlnX766dumTZvWLhLT8uXLc1atWtUAgqrac88999Hf/va3tvfdd1+FTfHf/e53N1x88cWHjRw58vNI4haL0047bdusWbNaR461bt267A8++KAhBElZJM6a7mPcuHGbn3vuudZPPPFEm3PPPffz6tavTNeuXffOmzevCQTdCSKJY1WPW22JtQ/iN4Bvhj+nAIe6+921GYhkvnTt66eBGuknGfMzpuvrUTLTFSO6r2rUIKs0elmjBlmlV4zoXuMX3BNPPNF29OjRm6OXnXHGGZunTZvWZsKECRs6deq0t1evXn179uzZZ8qUKW0ALrjggo2nn35698gglZtvvnnVGWecccTQoUN7dujQYV9kP9dff/3qb3/7218aPHhwz7Zt28Y0XPfII4/cedhhh+0BOOGEE7avX78+56STTtoOMGHChI29evXa079//97du3fv+/3vf7/rvn37bPTo0dvGjh37+VFHHdWrR48efb71rW99acuWLfvfkFu0aFH6/PPPL7v77rs7PPLII63KH/Pb3/721l27dmWPHz8+rmtODx48eM8NN9ywasSIET169OjRZ/jw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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "For the average peak season week in 2021, the optimal solution yields 35.288636 % more net revenue than the actual supply chain.\n"
     ]
    }
   ],
   "source": [
    "# Create a subset of data for the given year and season\n",
    "df_subset = df[(df['year']==year) & (df['peak']==peak_or_not)]\n",
    "df_subset['price_minus_transport'] = df_subset['price'] - df_subset['region'].map(c_transport) \n",
    "dates = sorted(list(set(df_subset.date))) \n",
    "\n",
    "# Run the optimizer for each week\n",
    "actual, optimal, display_figures = [], [], 0\n",
    "for date in dates: \n",
    "    df_date = df_subset[df_subset['date']==date] \n",
    "    weekly_sold = (df_date['units_sold']).values.sum()  \n",
    "    optimal.append(solve_MIQP(weekly_sold)[0]) \n",
    "    \n",
    "    actual_weekly_revenue = (df_date['units_sold']*(df_date['price_minus_transport'])).values.sum() \n",
    "    actual.append(actual_weekly_revenue) \n",
    "\n",
    "# Plot the two scatter plots\n",
    "fig_comparison, ax_comparison = plt.subplots(1,1) \n",
    "actual_plot = plt.scatter(dates, actual)\n",
    "optimal_plot = plt.scatter(dates, optimal)\n",
    "plt.legend((optimal_plot,actual_plot),('Optimal weekly net revenue','Actual weekly net revenue'),loc='center left', bbox_to_anchor=(1.25, 0.5), ncol=1)\n",
    "x_ticks_labels = list(dict.fromkeys([date.strftime(\"%B\") for date in  dates])) \n",
    "ax_comparison.set_xticklabels(x_ticks_labels, rotation=20, fontsize=12)\n",
    "ax_comparison.set_xlabel('Date')\n",
    "ax_comparison.set_ylabel('Net revenue in $million')\n",
    "\n",
    "plt.show()\n",
    "\n",
    "difference = [(i - j)/j for i, j in zip(optimal, actual)]\n",
    "print(\"For the average peak season week in %i, the optimal solution yields %f %% more net revenue than the actual supply chain.\"%(year,100*sum(difference)/len(difference)))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f5c053f3",
   "metadata": {},
   "source": [
    "Now, we can compare the price and sales between the optimal solution and actual data for each week. Select a week using the interactive tool and see the difference."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "aaf20e93",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Select a value for the available inventory (B) (in millions):\n",
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "356976dc1cd2405e87fe396038eccec4",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(Dropdown(description='x', options=(Timestamp('2021-02-07 00:00:00'), Timestamp('2021-02-…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<function __main__.compare_with_actual(x)>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def compare_with_actual(x):\n",
    "    df_date = df_subset[df_subset['date']==x]\n",
    "    weekly_sold = (df_date['units_sold']).values.sum()  \n",
    "    print(weekly_sold)\n",
    "    opt_revenue, opt_solution = solve_MIQP(weekly_sold) \n",
    "\n",
    "    df_comparison = df_date.merge(opt_solution, left_on='region', right_on='Region')\n",
    "\n",
    "    df_comparison = df_comparison[['Region','price','Price','units_sold','Sold']]\n",
    "    df_comparison = df_comparison.rename({'price': 'Actual price', 'Price': 'Optimal price','units_sold': 'Actual sold', 'Sold': 'Optimal sold'}, axis=1)\n",
    "    print(df_comparison.sort_values(by='Region').reset_index(drop=True))\n",
    "\n",
    "display_figures = 0\n",
    "print(\"Select a value for the available inventory (B) (in millions):\\n\")\n",
    "interact(compare_with_actual, x=dates)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8d07d2fd",
   "metadata": {},
   "source": [
    "Notice that for certain weeks and certain regions, the optimizer sets a higher price than the actual price if it foresees that even the dip in demand is worth it. In certain other cases, a lower price is preferred. Overall, the optimal solution rakes in close to 35% more net revenue than the actual case.\n",
    "This analysis demonstrates that the optimal pricing and supply of avocados could improve the efficiency of the avocado supply chain.\n",
    "\n",
    "With the right optimization tools, every day could be game day."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "25196f57",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Freeing default Gurobi environment\n"
     ]
    }
   ],
   "source": [
    "gp.disposeDefaultEnv()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e0888fb6",
   "metadata": {},
   "source": [
    "Copyright © 2022 Gurobi Optimization, LLC"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
